package com.itheima.mp.utils;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mp.domain.query.PageQuery;

/**
 * PageQuery 转换工具类，用于将自定义分页查询对象转换为框架特定的分页对象。
 *
 * @author ChenPi
 * @since 2024/12/21 14:30
 */
public class PageQueryConvertUtil {
    /**
     * 针对MyBatis-Plus分页结果转换的工具类
     */
    public static class MyBatisPlus {

        /**
         * 将 PageQuery 转换为 MyBatis-Plus 的分页对象 Page
         *
         * @param pageQuery 自定义分页查询对象
         * @param orders    排序条件数组（可选）
         * @param <T>       分页对象中的元素类型
         * @return MyBatis-Plus 的分页对象 Page
         */
        public static <T> Page<T> toMpPage(PageQuery pageQuery, OrderItem... orders) {
            // 1.分页条件
            Page<T> mpPage = new Page<>(pageQuery.getPageNo(), pageQuery.getPageSize());
            // 2.排序条件
            // 2.1.先看前端有没有传排序字段
            if (pageQuery.getSortBy() != null && !pageQuery.getSortBy().trim().isEmpty()) {
                mpPage.addOrder(new OrderItem(pageQuery.getSortBy(), pageQuery.getIsAsc()));
                return mpPage;
            }
            // 2.2.再看有没有手动指定排序字段
            if (orders != null && orders.length > 0) {
                for (OrderItem order : orders) {
                    mpPage.addOrder(order);
                }
            }
            return mpPage;
        }

        /**
         * 使用默认排序字段和顺序构建 MyBatis-Plus 分页对象
         *
         * @param pageQuery     自定义分页查询对象
         * @param defaultSortBy 默认排序字段
         * @param isAsc         是否升序
         * @param <T>           分页对象中的元素类型
         * @return MyBatis-Plus 的分页对象 Page
         */
        public static <T> Page<T> toMpPage(PageQuery pageQuery, String defaultSortBy, boolean isAsc) {
            return toMpPage(pageQuery, new OrderItem(defaultSortBy, isAsc));
        }

        /**
         * 默认按 create_time 字段降序排列构建 MyBatis-Plus 分页对象
         *
         * @param pageQuery 自定义分页查询对象
         * @param <T>       分页对象中的元素类型
         * @return MyBatis-Plus 的分页对象 Page
         */
        public static <T> Page<T> toMpPageDefaultSortByCreateTimeDesc(PageQuery pageQuery) {
            return toMpPage(pageQuery, "create_time", false);
        }

        /**
         * 默认按 update_time 字段降序排列构建 MyBatis-Plus 分页对象
         *
         * @param pageQuery 自定义分页查询对象
         * @param <T>       分页对象中的元素类型
         * @return MyBatis-Plus 的分页对象 Page
         */
        public static <T> Page<T> toMpPageDefaultSortByUpdateTimeDesc(PageQuery pageQuery) {
            return toMpPage(pageQuery, "update_time", false);
        }
    }

    // 如果将来需要支持其他框架的分页转换，可以在这里添加类似的内部类
}
